natural(cero).
natural(sucesor(X)) :- natural(X).

%moi(-X, +Y)
moi(cero, cero).
moi(cero, sucesor(_)).
moi(sucesor(X), sucesor(Y)) :- moi(X, Y).

%suma(+X, +Y, -Z)
suma(cero, X, X).
suma(sucesor(X), Y, sucesor(Z)) :- suma(X, Y, Z).

%producto(+X, +Y, -Z)
producto(cero, _, cero).
producto(sucesor(X), Y, Z) :- producto(X, Y, W), suma(W, Y, Z).

%factorial(+X, -F)
factorial(cero, sucesor(cero)).
factorial(sucesor(X), Z) :- factorial(X, W), producto(sucesor(X), W, Z).

%resta(+X, +Y, -Z)
resta(X, cero, X).
resta(X, sucesor(Y), Z) :- resta(X, Y, sucesor(Z)).

%division(+X, +Y, Z)
division(X, Y, cero) :- not(moi(Y, X)).
division(X, Y, sucesor(Z)) :- moi(Y, X), resta(X, Y, W), division(W, Y, Z).

%mod(+X, +Y, -Z)
mod(X, Y, Z) :- division(X, Y, Cociente), producto(Cociente, Y, DivEntera), resta(X, DivEntera, Z).

%entre(+X, +Y, -Z)
entre(X, Y, X) :- moi(X, Y).
entre(X, Y, Z) :- moi(X, Y), suma(X, sucesor(cero), W), entre(W, Y, Z).

%esPrimo(+X)
esPrimo(X) :- resta(X, sucesor(cero), Xm1), entre(sucesor(sucesor(cero)), Xm1, W), mod(X, W, Mod), not(moi(Mod, cero)).